给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。
注意:a和b都是32位整数
样例:如果 a=1 并且 b=2,返回3
分析:对于这道题以我浅薄的知识真的是没想出来(发现这是一道简单题,瞬间受到一万点伤害),这种接近于底层的东西,感觉自己在这方面太匮乏了。题目要求不能使用算术运算符号,基本上就能想到是通过二进制的位运算进行解答。但是想了半天也没什么头绪,只能默默地搜一下了。发现还是这篇文章讲得最靠谱了。lintcode刷题A+B问题位运算
然后突然想起自己的左移和右移有点淡忘了,就复习一下。移位包括逻辑移位和算术移位。逻辑移位是指移出去的位丢弃,空缺位用0来填充;算术移位是指移出去的位丢弃,空缺位用符号位来填充。当然对于无符号数来说,不管是左移还是右移都是逻辑移位;而对于有符号数而言,如果是左移则仍然是逻辑移位,但如果是右移则属于算术移位。
题目代码:比起oj里面的lintcode答案,还是比较喜欢上条链接里大佬写的代码,嘻嘻!
class Solution {
public:
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
// write your code here
if(a==0) return b;
if(b==0) return a;
int x1=(a&b)<<1;
int x2=a^b;
return aplusb(x1,x2);
}
};